/**
 * 位置管理工具类
 * 提供位置获取、保存、更新等功能
 */

const app = getApp();

class LocationManager {
    constructor() {
        this.locationData = null;
        this.listeners = [];
    }

    /**
     * 获取当前位置
     * @returns {Object} 位置信息
     */
    getCurrentLocation() {
        // 优先从全局数据获取
        if (app.globalData.userLocation) {
            return app.globalData.userLocation;
        }
        
        // 从本地存储获取
        const storedLocation = uni.getStorageSync('userLocation');
        if (storedLocation) {
            app.globalData.userLocation = storedLocation;
            return storedLocation;
        }
        
        // 返回默认位置
        return {
            latitude: 31.226215,
            longitude: 121.482595,
            timestamp: Date.now(),
            isDefault: true
        };
    }

    /**
     * 更新位置信息
     * @param {Function} callback 回调函数
     */
    updateLocation(callback) {
        uni.getLocation({
            type: 'gcj02',
            success: (res) => {
                const locationData = {
                    latitude: res.latitude,
                    longitude: res.longitude,
                    timestamp: Date.now()
                };
                
                // 保存位置信息
                this.saveLocation(locationData);
                
                // 通知监听器
                this.notifyListeners(locationData);
                
                if (callback) {
                    callback(null, locationData);
                }
            },
            fail: (err) => {
                console.error('获取位置失败:', err);
                
                if (callback) {
                    callback(err);
                }
            }
        });
    }

    /**
     * 保存位置信息
     * @param {Object} locationData 位置数据
     */
    saveLocation(locationData) {
        // 保存到全局数据
        app.globalData.userLocation = locationData;
        
        // 保存到本地存储
        uni.setStorageSync('userLocation', locationData);
        
        console.log('位置信息已保存:', locationData);
    }

    /**
     * 添加位置更新监听器
     * @param {Function} listener 监听器函数
     */
    addLocationListener(listener) {
        this.listeners.push(listener);
    }

    /**
     * 移除位置更新监听器
     * @param {Function} listener 监听器函数
     */
    removeLocationListener(listener) {
        const index = this.listeners.indexOf(listener);
        if (index > -1) {
            this.listeners.splice(index, 1);
        }
    }

    /**
     * 通知所有监听器
     * @param {Object} locationData 位置数据
     */
    notifyListeners(locationData) {
        this.listeners.forEach(listener => {
            try {
                listener(locationData);
            } catch (error) {
                console.error('位置监听器执行错误:', error);
            }
        });
    }

    /**
     * 检查位置是否过期（超过30分钟）
     * @param {Object} locationData 位置数据
     * @returns {Boolean} 是否过期
     */
    isLocationExpired(locationData) {
        if (!locationData || !locationData.timestamp) {
            return true;
        }
        
        const now = Date.now();
        const thirtyMinutes = 30 * 60 * 1000; // 30分钟
        
        return (now - locationData.timestamp) > thirtyMinutes;
    }

    /**
     * 获取格式化的位置字符串
     * @param {Object} locationData 位置数据
     * @returns {String} 格式化的位置字符串
     */
    getFormattedLocation(locationData) {
        if (!locationData) {
            return '未知位置';
        }
        
        return `${locationData.latitude.toFixed(6)}, ${locationData.longitude.toFixed(6)}`;
    }
}

// 创建单例实例
const locationManager = new LocationManager();

export default locationManager; 